package fr.adfm.managedbean;

import java.io.File;
import java.io.Serializable;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.ValueChangeEvent;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import fr.adfm.dto.ArticleDto;
import fr.adfm.dto.ArticlePanierDto;
import fr.adfm.dto.ArticleVetementDto;
import fr.adfm.dto.CouleurDto;
import fr.adfm.dto.PanierDto;
import fr.adfm.dto.ProduitDto;
import fr.adfm.dto.TailleDto;
import fr.adfm.service.facade.Facade;

@Component
@Scope("request")
public class FicheProduitCtrl implements Serializable {
	@Autowired
	private Facade facade;

	@Autowired
	private PanierCtrl panierCtrl;

	@Autowired
	private SessionManager sessionManager;
	
	private List<CouleurDto> couleurs;
	private List<TailleDto> tailles;
	private List<String> images;
	private int quantite = 1;

	public int getQuantite() {
		return quantite;
	}

	public void setQuantite(int quantite) {
		this.quantite = quantite;
	}

	public List<CouleurDto> getCouleurs() {
		if(couleurs == null)
			couleurs = getCouleurForOneTaille();
		return couleurs;
	}

	public void setCouleurs(List<CouleurDto> couleurs) {
		this.couleurs = couleurs;
	}

	public List<TailleDto> getTailles() {
		if(tailles == null)
			tailles = getTailleForOneCouleur();
		return tailles;
	}

	public void setTailles(List<TailleDto> tailles) {
		this.tailles = tailles;
	}

	public CouleurDto getSelectedCouleur() {
		return sessionManager.getSelectedCouleur();
	}

	public void setSelectedCouleur(CouleurDto selectedCouleur) {
		sessionManager.setSelectedCouleur(selectedCouleur);
	}

	public TailleDto getSelectedTaille() {
		return sessionManager.getSelectedTaille();
	}

	public void setSelectedTaille(TailleDto selectedTaille) {
		sessionManager.setSelectedTaille(selectedTaille);
	}

	public ProduitDto getProduitAffiche() {
		return sessionManager.getProduit();
	}

	private void initForProduit() {
		if(!(sessionManager.getProduit() == null)) {
			setSelectedTaille(null);
			setSelectedCouleur(null);
			quantite = 1;
			couleurs = getCouleurForOneTaille();
			tailles = getTailleForOneCouleur();
		}
	}
	
	public void setProduitAffiche(ProduitDto produitAffiche) {
		if(produitAffiche == null || ! produitAffiche.equals(getProduitAffiche())) {
			sessionManager.setProduit(produitAffiche);
			initForProduit();
		} else {
			sessionManager.setProduit(produitAffiche);
		}
	}

	public void setImages(List<String> images) {
		this.images = images;
	}

	
	public List<String> getImages() {
		String rootPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("resources/images/produits/"+getProduitAffiche().getId());
		images = new ArrayList<String>();
		File[] files = new File(rootPath).listFiles();
		if (files == null || files.length == 0) {
			images.add("produits/default.jpg");
			return images;
		}
		for(File tmp : files) {
			images.add("produits/"+getProduitAffiche().getId()+"/"+tmp.getName());
		}
		return images;
	}
	
	public void couleurChangeMethod(AjaxBehaviorEvent e){
		tailles = getTailleForOneCouleur();
	}
	
	public void tailleChangeMethod(AjaxBehaviorEvent e){
		couleurs = getCouleurForOneTaille();
	}
	
	public List<CouleurDto> getCouleurForOneTaille(){
		return facade.getVentePriveeService().getCouleurForOneTaille(getProduitAffiche(), getSelectedTaille());
	}
	
	public List<TailleDto> getTailleForOneCouleur(){
		return facade.getVentePriveeService().getTailleForOneCouleur(getProduitAffiche(), getSelectedCouleur());
	}

	public String ajouter() {
		if(getProduitAffiche() == null || getSelectedCouleur() == null || getSelectedTaille() == null || quantite <= 0) {
			return null;
		}
		PanierDto panier = panierCtrl.getPanier();
		ArticleVetementDto article = facade.getVentePriveeService().getArticle(getProduitAffiche().getId(), getSelectedCouleur().getId(), getSelectedTaille().getId());
		panier.getArticles().add(new ArticlePanierDto(article,quantite,article.getCouleur(), article.getTaille(),article.getProduitDto().getPrix()));
		return "liste_produits_vp";
	}
	
}
